AbstractConnection{

	var sourceName, targetName, ripple;
	
	*new{|sourceName, targetName, ripple|
		^super.newCopyArgs(sourceName, targetName, ripple);
	}
	
	trigger{
		ripple.playSound(targetName);	
	}
	
	getSourceName{
		^sourceName;
	}
	
	getTargetName{
		^targetName;
	}

	accept{|xb|
		xb.forConnection(this);
	}

}

Connection : AbstractConnection{

}

DelayMultiConnection : AbstractConnection{

	var delay = 6, delayVoices = 4;

	trigger{
		delayVoices.do{
			{
			ripple.playSound(targetName);	
			}.defer(delay);
		}
	}

}


